home *** CD-ROM | disk | FTP | other *** search
/ Revolution - Das Atari CD Magazin 1997 / Revolution - Das Atari CD Magazin 1.iso / software / anwendng / utility / cbhd502 / src / m2 / scsi.d < prev    next >
Text File  |  1997-01-21  |  20KB  |  511 lines

  1. DEFINITION MODULE Scsi;
  2. (****************************************************************************
  3.  *
  4.  * SCSI-Kommandos
  5.  * all devices
  6.  *
  7.  *
  8.  * $Source: E:\HM2\LIB\se\rcs\scsi.d,v $
  9.  *
  10.  * $Revision: 1.1 $
  11.  *
  12.  * $Author: S_Engel $
  13.  *
  14.  * $Date: 1996/02/03 19:31:10 $
  15.  *
  16.  * $State: Exp $
  17.  *
  18.  *****************************************************************************
  19.  * History:
  20.  *
  21.  * $Log: scsi.d,v $
  22.  * Revision 1.1  1996/02/03  19:31:10  S_Engel
  23.  * Initial revision
  24.  *
  25.  ****************************************************************************
  26.  * Altes Modul: SCSI2.D
  27.  *
  28.  * Revision 1.5  1995/10/30  17:45:14  S_Engel
  29.  *
  30.  *
  31.  ****************************************************************************)
  32.  
  33. IMPORT
  34.   SYSTEM;
  35. FROM SYSTEM  IMPORT BYTE,ADDRESS,TSIZE;
  36.  
  37. FROM Portab IMPORT UChar, Char;
  38.  
  39.  
  40. IMPORT
  41.   ScsiIO;
  42.  
  43. (*--------- Deklarationsteil *)
  44.  
  45. CONST
  46.  
  47.   (*--- Konstanten für Requenst-Sense-Kommando (SenseKey) *)
  48.  
  49.   NoSense         =  0;       (* keine Fehlerbeschreibung             *)
  50.   RecoveredError  =  1;       (* behobener Fehler                     *)
  51.   NotReady        =  2;       (* nicht bereit                         *)
  52.   MediumError     =  3;       (* Medium Fehler                        *)
  53.   HardwareError   =  4;       (* Hardware Fehler                      *)
  54.   IllegalRequest  =  5;       (* falsche Parameter                    *)
  55.   UnitAttention   =  6;       (* Unit-Attention-Status                *)
  56.   DataProtect     =  7;       (* nicht benutzt von Festplatten        *)
  57.   BlankCheck      =  8;       (*   "      "     "      "              *)
  58.   VendorUnique    =  9;       (*   "      "     "      "              *)
  59.   AbortedCopy     = 10;       (*   "      "     "      "              *)
  60.   AbortedCommand  = 11;       (* Kommando abgebrochen                 *)
  61.   DataEqual       = 12;       (* nicht benutzt von Festplatten        *)
  62.   VolumeOverflow  = 13;       (*   "      "     "      "              *)
  63.   Miscompare      = 14;       (* Vergleich fehlgeschlagen             *)
  64.  
  65.   (*--- Konstanten für Device bei Inquiry gemäß ANSI-Norm *)
  66.   DirectAccessDev =  0;       (* Gerät mit Direktzugriff (Festplatte) *)
  67.   SeqAccessDev    =  1;       (*   "    "  seq. Zugriff  (Streamer)   *)
  68.   PrinterDev      =  2;       (* Drucker                              *)
  69.   ProcessorDev    =  3;       (* Hostadapter                          *)
  70.   WormDev         =  4;       (* WORM-Laufwerk                        *)
  71.   ReadOnlyDev     =  5;       (* nur-lese Laufwerk (CD-ROM)           *)
  72.  
  73.  
  74.   DIRECTACCESSDEV =  0;       (* Gerät mit Direktzugriff (Festplatte) *)
  75.   SEQACCESSDEV    =  1;       (*   "    "  seq. Zugriff  (Streamer)   *)
  76.   PRINTERDEV      =  2;       (* Drucker                              *)
  77.   PROCESSORDEV    =  3;       (* Hostadapter                          *)
  78.   WORMDEV         =  4;       (* WORM-Laufwerk                        *)
  79.   ROMDEV          =  5;       (* nur-lese Laufwerk (CD-ROM)           *)
  80.   SCANNERDEF      =  6;       (* Scanner                              *)
  81.   OPTICALMEMDEV   =  7;       (* optical memory device                *)
  82.   MEDIUMCHNGDEV   =  8;       (* medium changer device (zB JukeBox)   *)
  83.   COMMDEV         =  9;       (* Communicationdevice                  *)
  84.   GRAPHDEV1       = 10;
  85.   GRAPHDEV2       = 11;
  86.   UNKNOWNDEV      = 31;
  87.  
  88. TYPE
  89.  
  90. (*-------------------------------------------------------------------------*)
  91. (*-                                                                       -*)
  92. (*- Mode Pages                                                            -*)
  93. (*-                                                                       -*)
  94. (*-------------------------------------------------------------------------*)
  95.  
  96.                             (*    7     6     5     4     3     2     1     0 *)
  97. (*** All Device Types ***)
  98.     tDTDC         = BYTE;   (*    Reserved                       |  DTDC      *)
  99.     tPage02       = RECORD   (* Disconnect/Reconnect Page *)
  100.                       BufferFullRatio   : BYTE;
  101.                       BufferEmptyRatio  : BYTE;
  102.                       BudInactLimit     : SHORTCARD;
  103.                       DiscTimeLimit     : SHORTCARD;
  104.                       ConnectTimeLimit  : SHORTCARD;
  105.                       MaxBurstSize      : SHORTCARD;
  106.                       DTDC              : tDTDC;
  107.                       Reserved13        : BYTE;
  108.                       Reserved          : ARRAY[14..15] OF BYTE;
  109.                     END;
  110.  
  111.     tPage09       = RECORD   (* Peripheral Device Page *)
  112.                       Identifier  : SHORTCARD;
  113.                       Reserved    : ARRAY[4..7] OF BYTE;
  114.                       (* Vendor specific *)
  115.                     END;
  116.  
  117.     tRLEC      = BYTE;      (* Reserved                                | RLEC *)
  118.     tQueueModif= BYTE;      (* Queue Modif                 | Res | QErr| DQue *)
  119.     tEECA      = BYTE;      (* EECA| Reserved              |RAENP|UAAENP|EAENP*)
  120.     tPage0A    = RECORD     (* Control Mode Page *)
  121.                       RLEC        : tRLEC;
  122.                       QueueModif  : tQueueModif;
  123.                       EECA        : tEECA;
  124.                       Reserved    : BYTE;
  125.                       AENHoldOff  : SHORTCARD;
  126.                     END;
  127.  
  128. (*** Sequential Devices ***)
  129.  
  130.     (* Device Sepecific Qualifiers, Parameter Header *)
  131.     tSeqFlags   = (Speed0,       (* Speed Code                   *)
  132.                    Speed1,
  133.                    Speed2,
  134.                    Speed3,
  135.                    BufMode,      (* Buffered Mode                *)
  136.                    STR5,STR6,    (* reserviert                   *)
  137.                    WrProt);      (* Write Protect                *)
  138.     tsSeqFlags  = SET OF tSeqFlags;
  139.  
  140.  
  141.     tSeqErrorFlags = (DCR, DTE, PER, EER, tSeqErrRes4, TB, tSeqErrRes6, tSeqErrRes7);
  142.     tsSeqErrorFlags  = SET OF tSeqErrorFlags;
  143.     tSeqPage01  = RECORD    (* Read-Write Error Recovery Page *)
  144.                     SeqError        : tsSeqErrorFlags;
  145.                     ReadRetryCount  : UChar;
  146.                     Reserved1       : ARRAY[4..7] OF BYTE;
  147.                     WriteRetryCount : UChar;
  148.                     Reserved9       : BYTE;
  149.                     Reserved10      : ARRAY[10..11] OF BYTE;
  150.                   END;
  151.  
  152.     tSP10Fl1    = (NGroup0,
  153.                    NGroup1,
  154.                    NGroup2,
  155.                    G3ECC,
  156.                    RAW,
  157.                    CAF,
  158.                    cap,
  159.                    SP10Fl1Res7);
  160.     tSP10Fl2    = (REW,
  161.                    RBO,
  162.                    SOCF0,
  163.                    SOCF1,
  164.                    AVC,
  165.                    RSmk,
  166.                    BIS,
  167.                    DBR);
  168.     tSP10Fl3    = (SP10Fl3Res0,
  169.                    SP10Fl3Res1,
  170.                    SP10Fl3Res2,
  171.                    SEW,
  172.                    EEG,
  173.                    EODDefined0,
  174.                    EODDefined1,
  175.                    EODDefined2);
  176.  
  177.     tSP10Flags1 = SET OF tSP10Fl1;
  178.     tSP10Flags2 = SET OF tSP10Fl2;
  179.     tSP10Flags3 = SET OF tSP10Fl3;
  180.     tSeqPage10  = RECORD    (* Device Configurating Page *)
  181.                     SP10Flags1      : tSP10Flags1;
  182.                     ActivePart      : UChar;
  183.                     WrtBuffRartio   : UChar;
  184.                     RdBuffRatio     : UChar;
  185.                     WriteDelay      : SHORTCARD;
  186.                     SP10Flags2      : tSP10Flags2;
  187.                     GapSize         : UChar;
  188.                     SP10Flags3      : tSP10Flags3;
  189.                     EarlyWarnMSB    : UChar;
  190.                     EarlyWarnLSW    : SHORTCARD;
  191.                     ComprAlgo       : UChar;
  192.                     Reserved        : BYTE;
  193.                   END;
  194.  
  195.  
  196.     tSeqPage0F  = RECORD    (* Data Compression Characteristics (HP only??) *)
  197.                     Flags1          : BYTESET;
  198.                     Flags2          : BYTESET;
  199.                     Compalgorythm   : LONGCARD;
  200.                     Decompalgorythm : LONGCARD;
  201.                     Reserved        : LONGCARD;
  202.                   END;
  203.  
  204.  
  205. (*** CD-ROM Devices ***)
  206.  
  207.     (* Device Sepecific Qualifiers, Parameter Header *)
  208.     tCDFlags    = (EBC,           (* Enable Blank Check (res) *)
  209.                    CDRes1,
  210.                    CDRes2,
  211.                    CDRes3,
  212.                    Cache,         (* Laufwerk hat ein Cache   *)
  213.                    CDRes5,
  214.                    CDRes6,
  215.                    CDRes7);
  216.     tsCDFlags  = SET OF tSeqFlags;
  217.  
  218.     (* Page 0D : CD-ROM Parameters Page *)
  219.     tCDPage0D   = RECORD
  220.                     CDP0DRes2 : BYTE;
  221.                     InactTMul : BYTE;      (* unteres Nibble *)
  222.                     SperMSF   : SHORTCARD;
  223.                     FperMSF   : SHORTCARD;
  224.                   END;
  225.  
  226.     (* Page 0E : CD-ROM Audio Control Page *)
  227.     tCDChSel = (Ch0,              (* Kanal 0 an diesen Output-Port  *)
  228.                 Ch1,              (* Kanal 1 an diesen Output-Port  *)
  229.                 Ch2,              (* Kanal 2 an diesen Output-Port  *)
  230.                 Ch3,              (* Kanal 3 an diesen Output-Port  *)
  231.                 ChRes4,
  232.                 ChRes5,
  233.                 ChRes6,
  234.                 ChgRes7);
  235.     tsCDChSel = SET OF tCDChSel;
  236.     tCDPage0E   = RECORD
  237.                     ImmedFlags      : BYTESET;
  238.                     CD0ERes3        : BYTE;
  239.                     CD0ERes4        : BYTE;
  240.                     LBAFlags        : BYTESET;
  241.                     BlocksPerSecond : SHORTCARD;
  242.                       (* Genau:
  243.                        *   LBAFlags MOD 10H = 0 -> BlocksPerSecond
  244.                        *   LBAFlags MOD 10H = 8 -> 256 * BlocksPerSecond
  245.                        *)
  246.                     Port0Channel    : tsCDChSel;
  247.                     Port0Volume     : UChar;
  248.                     Port1Channel    : tsCDChSel;
  249.                     Port1Volume     : UChar;
  250.                     Port2Channel    : tsCDChSel;
  251.                     Port2Volume     : UChar;
  252.                     Port3Channel    : tsCDChSel;
  253.                     Port3Volume     : UChar;
  254.                   END;
  255.  
  256.  
  257. CONST
  258.     CDDefDens         = 00H;
  259.     CDUserDataDens    = 01H;
  260.     CDUserDataAuxDens = 02H;
  261.     CDOnlyAudioDens   = 04H;    (* 1/75 sec / Block *)
  262.  
  263.  
  264. TYPE
  265.     tModeParms  = RECORD
  266.                     CASE : SHORTCARD OF
  267.                       (* All Device-Types *)
  268.                     |2   : P02      : tPage02;
  269.                     |9   : P09      : tPage09;
  270.                       (* Sequential Devices *)
  271.                     |101H : SeqP01   : tSeqPage01;
  272.                     |10FH : SeqP0F   : tSeqPage0F;
  273.                     |110H : SeqP10   : tSeqPage10;
  274.                     |201H : CDP0D    : tCDPage0D;
  275.                     |202H : CDP0E    : tCDPage0E;
  276.                     END;
  277.                   END;
  278.  
  279. (*-------------------------------------------------------------------------*)
  280. (*-                                                                       -*)
  281. (*- ModeSense-Typen                                                       -*)
  282. (*-                                                                       -*)
  283. (*-------------------------------------------------------------------------*)
  284.     tDeviceSpecs  = RECORD
  285.                       CASE : SHORTCARD OF
  286.                        1 : Seq : tsSeqFlags;
  287.                       |2 : CD  : tsCDFlags;
  288.                       END;
  289.                     END;
  290.  
  291.     tParmHead     = RECORD
  292.                       ModeLength  : UChar;
  293.                       MediumType  : UChar;
  294.                       DeviceSpecs : BYTESET;        (* tDeviceSpecs *)
  295.                       BlockDescLen: UChar;
  296.                     END;
  297.     (*$?TSIZE(tParmHead) # 4 : Fragezeichen? *)
  298.  
  299.     tBlockDesc    = RECORD
  300.                       Blocks      : LONGCARD;       (* Byte HH = DensityCode *)
  301.                       BlockLen    : LONGCARD;       (* Byte HH = Reserved    *)
  302.                     END;
  303.     (*$?TSIZE(tBlockDesc) # 8 : Fragezeichen? *)
  304.  
  305.     tPage         = RECORD
  306.                       PageCode    : UChar;          (* PS | Res | Pagecode *)
  307.                       PageLen     : UChar;
  308.                       ModeParms   : tModeParms;     (* Seiten und Typabhängig *)
  309.                     END;
  310.  
  311.     tModePage     = RECORD
  312.                       ParmHead    : tParmHead;
  313.                       BlockDesc   : tBlockDesc;
  314.                       Page        : tPage;
  315.                     END;
  316.  
  317.  
  318.  
  319.     tVendor       = ARRAY[0..07] OF CHAR;
  320.     tProduct      = ARRAY[0..15] OF CHAR;
  321.     tInquiry      = RECORD
  322.                        Device          : UChar;
  323.                        DeviceQualifier : BYTE;
  324.                        VersionFlags    : BYTE;
  325.                        FormatFlags     : BYTE;
  326.                        AdditionalLen   : UChar;
  327.                        Res1            : BYTE;
  328.                        Reserved        : ARRAY[6..7] OF BYTE;
  329.                        Vendor          : tVendor;
  330.                        Product         : tProduct;
  331.                        RevionsData     : ARRAY[0..3] OF CHAR;
  332.                      END;
  333.  
  334.  
  335. VAR ScsiFlags : BITSET;
  336.  
  337.  
  338. PROCEDURE TestUnitReady() : BOOLEAN;
  339.   (*
  340.    * TestUnitReadyCmd testet, ob das gewählte SCSI-Gerät bereit ist.
  341.    *)
  342.  
  343.  
  344.  
  345. (*-------------------------------------------------------------------------*)
  346. (*-                                                                       -*)
  347. (*- Inquiry mit der Möglichkeit zu Vital Data                             -*)
  348. (*-                                                                       -*)
  349. (*-------------------------------------------------------------------------*)
  350. PROCEDURE Inquiry(Buffer : ADDRESS; Vital : BOOLEAN; Page : SHORTCARD;
  351.                   Len : SHORTCARD) : BOOLEAN;
  352.  
  353.  
  354.  
  355. (*-------------------------------------------------------------------------*)
  356. (*-                                                                       -*)
  357. (*- Mode Select                                                           -*)
  358. (*-                                                                       -*)
  359. (*- SelectFlags : Parameter, wie gesichert werden soll                    -*)
  360. (*- Buffer      : Zeiger auf die Mode-Parameter                           -*)
  361. (*- ParmLen     : Länge des ParameterFeldes                               -*)
  362. (*-                 Länge der Daten in der ModePage!                      -*)
  363. (*-                 TSIZE(tModeParms.tag) + 2 !!                          -*)
  364. (*-                                                                       -*)
  365. (*-------------------------------------------------------------------------*)
  366. TYPE  tSelectFlag     = (SMP,          (* Save Mode Parameters         *)
  367.                          tsRes1,
  368.                          tsRes2,
  369.                          tsRes3,
  370.                          PF,           (* Page Format                  *)
  371.                          tsLun0,
  372.                          tsLun1,
  373.                          tsLun2);
  374.       tsSelectFlag    = SET OF tSelectFlag;
  375. PROCEDURE ModeSelect(SelectFlags : tsSelectFlag;
  376.                         Buffer      : ADDRESS;
  377.                         ParmLen     : SHORTCARD) : BOOLEAN;
  378.  
  379. (*-------------------------------------------------------------------------*)
  380. (*-                                                                       -*)
  381. (*- Mode Sense                                                            -*)
  382. (*-                                                                       -*)
  383. (*- PageCode    : Nummer der zu lesenden Page                             -*)
  384. (*- PageControl : auszulesende Parameter                                  -*)
  385. (*- Buffer      : Zeiger auf die Mode-Parameter                           -*)
  386. (*- ParmLen     : Länge des ParameterFeldes                               -*)
  387. (*-                 Länge der Daten in der ModePage!                      -*)
  388. (*-                 TSIZE(tModeParms.tag) + 2 !!                          -*)
  389. (*-                                                                       -*)
  390. (*-------------------------------------------------------------------------*)
  391. TYPE tPC = (CurrentValues, ChangeableValues, DefaultValues, SavedValues);
  392. PROCEDURE ModeSense(PageCode     : SHORTCARD;
  393.                        PageControl  : tPC;
  394.                        Buffer       : ADDRESS;
  395.                        ParmLen      : SHORTCARD) : BOOLEAN;
  396.  
  397.  
  398.  
  399.  
  400. TYPE ErrorType = (nomedia, mediachange, reset, unknown);
  401.  
  402. PROCEDURE GetError(reqbuff : ADDRESS) : ErrorType;
  403.  
  404.  
  405. PROCEDURE PreventMediaRemoval(Prevent:BOOLEAN) : BOOLEAN;
  406.   (*
  407.    * PreventMediaRemvolCmd ver- bzw. entriegelt das eingelegte Medium,
  408.    * wenn Prevent gleich TRUE bzw. FALSE ist.
  409.    *)
  410.     
  411.  
  412.  
  413. (*-------------------------------------------------------------------------*)
  414. (*-                                                                       -*)
  415. (*- Allgemeine Tools                                                      -*)
  416. (*-                                                                       -*)
  417. (*-------------------------------------------------------------------------*)
  418. (*PROCEDURE SuperOn;*)
  419.  
  420. (*PROCEDURE SuperOff;*)
  421.  
  422. PROCEDURE Wait(Ticks : LONGCARD);
  423.  
  424. PROCEDURE SetBlockSize(NewLen : LONGCARD);
  425.   (*
  426.    * SetBlockLen legt die Blocklänge für das SCSI-Gerät fest
  427.    * (normalerweise 512 Bytes).
  428.    *)
  429.  
  430. PROCEDURE GetBlockSize() : LONGCARD;
  431.   (*
  432.    * GetBlockLen gibt die aktuell eingestellte Blocklänge zurück.
  433.    *)
  434.  
  435.  
  436. VAR SetScsiUnit : PROCEDURE((* handle  *) ScsiIO.tHandle,
  437.                             (* Lun     *) SHORTINT,
  438.                             (* MaxLen  *) LONGCARD);
  439. PROCEDURE MySetScsiUnit(handle : ScsiIO.tHandle; Lun : SHORTINT; MaxLen : LONGCARD);
  440.   (*
  441.    * SetScsiUnit legt das Gerät fest an das die nachfolgenden Kommandos
  442.    * gesendet werden und wie lang die Transfers maximal sein dürfen.
  443.    *)
  444.  
  445.  
  446. (*-------------------------------------------------------------------------*)
  447. (*-                                                                       -*)
  448. (*- Zugriff für Submodule (ScsiStreamer, ScsiCD, ScsiDisk...)             -*)
  449. (*-                                                                       -*)
  450. (*-------------------------------------------------------------------------*)
  451.  
  452. TYPE
  453.   tpCmd6  = POINTER TO tCmd6;
  454.   tCmd6   = RECORD
  455.               Command : UChar;
  456.               LunAdr  : BYTE;
  457.               Adr     : SHORTCARD;
  458.               Len     : UChar;
  459.               Flags   : BYTE;
  460.             END;  
  461.  
  462.   tpCmd10 = POINTER TO tCmd10;
  463.   tCmd10  = RECORD
  464.               Command : UChar;
  465.               Lun     : BYTE;
  466.               Adr     : LONGCARD;
  467.               Reserved: UChar;
  468.               LenHigh : UChar;
  469.               LenLow  : UChar;
  470.               Flags   : BYTE; 
  471.             END;
  472.  
  473.   tpCmd12 = POINTER TO tCmd12;
  474.   tCmd12  = RECORD
  475.               Command : UChar;
  476.               Lun     : BYTE;
  477.               Adr     : LONGCARD;
  478.               Len     : LONGCARD;
  479.               Reserved: BYTE;
  480.               Flags   : BYTE; 
  481.             END;
  482.  
  483. VAR
  484.   Cmd6            : tCmd6;
  485.   Cmd10           : tCmd10;
  486.   Cmd12           : tCmd12;
  487.   BlockLen        : SHORTCARD;
  488.   MaxDmaLen       : LONGCARD;
  489.   LogicalUnit     : SHORTCARD;
  490.  
  491. PROCEDURE SetCmd6(VAR CmdBlock : ARRAY OF SYSTEM.LOC;
  492.                   Cmd :SHORTCARD;BlockAdr:LONGCARD;
  493.                                    TransferLen:SHORTCARD) : tpCmd6;
  494.  
  495. PROCEDURE SetCmd10(VAR CmdBlock : ARRAY OF SYSTEM.LOC;
  496.                    Cmd :SHORTCARD;BlockAdr:LONGCARD;
  497.                                       TransferLen:SHORTCARD) : tpCmd10;
  498.          
  499. PROCEDURE SetCmd12(VAR CmdBlock : ARRAY OF SYSTEM.LOC;
  500.                    Cmd : SHORTCARD; BlockAdr    : LONGCARD;
  501.                                     TransferLen : LONGCARD) : tpCmd12;
  502.  
  503. PROCEDURE SetCmd(VAR ScsiCmd  : ARRAY OF SYSTEM.LOC;
  504.                  VAR CmdBlock : ARRAY OF SYSTEM.LOC;
  505.                      Buffer   : SYSTEM.ADDRESS;
  506.                      Len      : LONGCARD;
  507.                      TimeOut  : LONGCARD) : ScsiIO.tpSCSICmd;
  508.  
  509.  
  510. END Scsi.
  511.